{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from matplotlib import pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [],
   "source": [
    "m=500\n",
    "n=2\n",
    "X=np.empty(shape=(m,n))\n",
    "X[:,0] = np.random.uniform(size=m)\n",
    "X[:,1] =X[:,0] * 3 + 1 + np.random.normal(size=m)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [],
   "source": [
    "def demean(X):\n",
    "    return X - np.mean(X, axis=0)\n",
    "\n",
    "\n",
    "def J(X, w):\n",
    "    return np.sum((X.dot(w)) ** 2) / len(X)\n",
    "\n",
    "\n",
    "def dJ(X, w):\n",
    "    return X.T.dot(X.dot(w)) * 2 / len(X)\n",
    "\n",
    "\n",
    "def substract(X, w):\n",
    "    return X - X.dot(w).reshape(-1, 1) * w\n",
    "\n",
    "\n",
    "def direction(w):\n",
    "    return w / np.linalg.norm(w)\n",
    "\n",
    "\n",
    "def gradient_asccent(X, initial_w, n_iters=1e4, eta=0.01, epsilon=1e-8):\n",
    "    \"\"\"单\"\"\"\n",
    "    # 将w转换成单位向量\n",
    "    w = direction(initial_w)\n",
    "    i_iter = 0\n",
    "    while i_iter < n_iters:\n",
    "        dw = dJ(X, w)\n",
    "        last_w = w\n",
    "        w = w + eta * dw\n",
    "        w = direction(w)\n",
    "        if np.abs(J(X, w) - J(X, last_w)) < epsilon:\n",
    "            break\n",
    "        i_iter += 1\n",
    "    return w\n",
    "\n",
    "\n",
    "def gradient_asccent_n(n, X, n_iters=1e4, eta=0.01, epsilon=1e-8):\n",
    "    \"\"\"多\"\"\"  # 将X做demean处理\n",
    "    X_pca = X.copy()\n",
    "    X_pca = demean(X)\n",
    "    res = []\n",
    "    for i in range(n):\n",
    "        initial_w = np.random.random(X_pca.shape[1])\n",
    "        w = gradient_asccent(X_pca, initial_w)\n",
    "        res.append(w)\n",
    "        X_pca = substract(X_pca, w)\n",
    "    return res\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x11dfb2198>]"
      ]
     },
     "execution_count": 139,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11dfb24e0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "X1=demean(X)\n",
    "plt.scatter(X1[:,0],X1[:,1])\n",
    "initial_w = np.random.random(X.shape[1]) \n",
    "w=gradient_asccent_n(2,X)\n",
    "nw=np.array(w)\n",
    "plt.plot([0,nw[0,0]],[0,nw[0,1]],color='r')\n",
    "plt.plot([0,nw[1,0]],[0,nw[1,1]],color='r')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
